OPC Studio User's Guide and Reference
Installed Examples - Console - SubscribeFromXml

Loads a list of OPC "Classic" items from an XML file and subscribes to them.

The main program:

// This example shows how to load a list of OPC "Classic" items from an XML file and subscribe to them.
//
// Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
// OPC client and subscriber examples in C# on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-CSharp .
// Missing some example? Ask us for it on our Online Forums, https://www.opclabs.com/forum/index ! You do not have to own
// a commercial license in order to use Online Forums, and we reply to every post.

using System;
using System.Threading;
using System.Xml;
using System.Xml.Serialization;
using OpcLabs.BaseLib.Runtime.InteropServices;
using OpcLabs.EasyOpc.DataAccess;
using OpcLabs.EasyOpc.DataAccess.OperationModel;

namespace SubscribeFromXml
{
    class Program
    {
        static void Main()
        {
            ComManagement.Instance.AssureSecurityInitialization();

            Console.WriteLine("Loading items from XML file...");
            var xmlSerializer = new XmlSerializer(typeof(DAItemGroupArguments[]));
            var xmlReader = XmlReader.Create("OpcItems.xml", new XmlReaderSettings {IgnoreWhitespace = true});
            var argArray = (DAItemGroupArguments[]) (xmlSerializer.Deserialize(xmlReader));

            if (!(argArray is null))
            {
                Console.WriteLine();
                Console.WriteLine("Arguments loaded:");
                foreach (DAItemGroupArguments itemGroupArguments in argArray)
                    Console.WriteLine($"  {itemGroupArguments}");

                Console.WriteLine();
                Console.WriteLine("Subscribing for 30 seconds...");
                EasyDAClient.SharedInstance.SubscribeMultipleItems(argArray,
                    (_, eventArgs) => Console.WriteLine(
                        $"[{eventArgs.Arguments.State}] {eventArgs.Arguments.ItemDescriptor.ItemId}: {eventArgs.Vtq}"));
                Thread.Sleep(30 * 1000);

                Console.WriteLine();
                Console.WriteLine("Unsubscribing...");
                EasyDAClient.SharedInstance.UnsubscribeAllItems();
            }

            Console.WriteLine();
            Console.WriteLine("Finished.");
        }
    }
}
'
' Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
' OPC client and subscriber examples in VB.NET on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-VBNET .
' Missing some example? Ask us for it on our Online Forums, https://www.opclabs.com/forum/index ! You do not have to own
' a commercial license in order to use Online Forums, and we reply to every post.

Imports System.Threading
Imports System.Xml
Imports System.Xml.Serialization
Imports OpcLabs.BaseLib.Runtime.InteropServices
Imports OpcLabs.EasyOpc.DataAccess
Imports OpcLabs.EasyOpc.DataAccess.OperationModel


Friend Class Program
    Shared WithEvents _client As New EasyDAClient

    <MTAThread> ' needed for COM security initialization to succeed
    Shared Sub Main()
        ComManagement.Instance.AssureSecurityInitialization()

        Console.WriteLine("Loading items from XML file...")
        Dim xmlSerializer = New XmlSerializer(GetType(DAItemGroupArguments()))
        Dim xmlReader = Xml.XmlReader.Create("OpcItems.xml", New XmlReaderSettings With {.IgnoreWhitespace = True})
        Dim argArray = CType(xmlSerializer.Deserialize(xmlReader), DAItemGroupArguments())

        If argArray IsNot Nothing Then
            Console.WriteLine("Subscribing for 30 seconds...")
            _client.SubscribeMultipleItems(argArray)
            Thread.Sleep(30 * 1000)

            Console.WriteLine("Unsubscribing...")
            _client.UnsubscribeAllItems()
        End If

        Console.WriteLine("Finished.")
    End Sub

    Private Shared Sub ItemChanged(ByVal sender As Object, ByVal eventArgs As EasyDAItemChangedEventArgs) Handles _client.ItemChanged
        Console.WriteLine("{0}: {1}", eventArgs.Arguments.ItemDescriptor.ItemId, eventArgs.Vtq)
    End Sub
End Class

 

The XML file with list of items:

<?xml version="1.0" encoding="utf-8"?>
<!-- This file specifies the OPC items to be subscribed to, and their associated state objects (integers, in this case). -->
<ArrayOfDAItemGroupArguments xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <DAItemGroupArguments>
    <State xmlns="http://schemas.datacontract.org/2004/07/OpcLabs.BaseLib.OperationModel">
      <TypeFullName xmlns="http://schemas.datacontract.org/2004/07/OpcLabs.BaseLib.Xml">System.Int32</TypeFullName>
      <Instance xmlns="http://schemas.datacontract.org/2004/07/OpcLabs.BaseLib.Xml">1</Instance>
    </State>
    <ServerDescriptor xmlns="http://schemas.datacontract.org/2004/07/OpcLabs.EasyOpc.DataAccess.OperationModel">
      <UrlString xmlns="http://schemas.datacontract.org/2004/07/OpcLabs.BaseLib">opcda:OPCLabs.KitServer.2</UrlString>
    </ServerDescriptor>
    <ItemDescriptor xmlns="http://schemas.datacontract.org/2004/07/OpcLabs.EasyOpc.DataAccess.OperationModel">
      <NodeId xmlns="http://schemas.datacontract.org/2004/07/OpcLabs.EasyOpc">Simulation.Random</NodeId>
    </ItemDescriptor>
    <GroupParameters xmlns="http://schemas.datacontract.org/2004/07/OpcLabs.EasyOpc.DataAccess.OperationModel">
      <RequestedUpdateRate xmlns="http://schemas.datacontract.org/2004/07/OpcLabs.EasyOpc.DataAccess">1000</RequestedUpdateRate>
      <PercentDeadband xmlns="http://schemas.datacontract.org/2004/07/OpcLabs.EasyOpc.DataAccess">0.0</PercentDeadband>
    </GroupParameters>
  </DAItemGroupArguments>
  <DAItemGroupArguments>
    <State xmlns="http://schemas.datacontract.org/2004/07/OpcLabs.BaseLib.OperationModel">
      <TypeFullName xmlns="http://schemas.datacontract.org/2004/07/OpcLabs.BaseLib.Xml">System.Int32</TypeFullName>
      <Instance xmlns="http://schemas.datacontract.org/2004/07/OpcLabs.BaseLib.Xml">2</Instance>
    </State>
    <ServerDescriptor xmlns="http://schemas.datacontract.org/2004/07/OpcLabs.EasyOpc.DataAccess.OperationModel">
      <UrlString xmlns="http://schemas.datacontract.org/2004/07/OpcLabs.BaseLib">opcda:OPCLabs.KitServer.2</UrlString>
    </ServerDescriptor>
    <ItemDescriptor xmlns="http://schemas.datacontract.org/2004/07/OpcLabs.EasyOpc.DataAccess.OperationModel">
      <NodeId xmlns="http://schemas.datacontract.org/2004/07/OpcLabs.EasyOpc">Simulation.Ramp (10 s)</NodeId>
    </ItemDescriptor>
    <GroupParameters xmlns="http://schemas.datacontract.org/2004/07/OpcLabs.EasyOpc.DataAccess.OperationModel">
      <RequestedUpdateRate xmlns="http://schemas.datacontract.org/2004/07/OpcLabs.EasyOpc.DataAccess">1000</RequestedUpdateRate>
      <PercentDeadband xmlns="http://schemas.datacontract.org/2004/07/OpcLabs.EasyOpc.DataAccess">0.0</PercentDeadband>
    </GroupParameters>
  </DAItemGroupArguments>
</ArrayOfDAItemGroupArguments>

 

See Also

Conceptual